//#include "lib.h"
#include "msp432_usart.h"


#include <string.h>
#include <stdarg.h>
#include <stdio.h>



uint16_t Serial_Rx[19];
uint16_t Serial_Tx[19];


/*
函数功能：串口格式化打印
输入：串口基地址
    填入值包括：
    EUSCI_A0_BASE    
    EUSCI_A1_BASE    
    EUSCI_A2_BASE    
    EUSCI_A3_BASE   
输出：无
备注：按照格式化打印输出内容
*/
void UART_printf(uint32_t baseAddress, const char *format,...)
{
    uint32_t length;
    va_list args;
    uint32_t i;
    char TxBuffer[128] = {0};

    va_start(args, format);
    length = vsnprintf((char*)TxBuffer, sizeof(TxBuffer)+1, (char*)format, args);
    va_end(args);

    for(i = 0; i < length; i++)
        UART_transmitData(baseAddress, TxBuffer[i]);
}

/*
函数功能：发送一个十六进制数据
输入：串口基地址、要发送的数据(若不是16进制，则强制转换成16进制发送)
    填入值包括：
    EUSCI_A0_BASE    
    EUSCI_A1_BASE    
    EUSCI_A2_BASE    
    EUSCI_A3_BASE 
    
输出：无
备注：无
*/
void UART_Send_Hexnum(uint32_t baseAddress,uint16_t    num)
{
    UART_transmitData(baseAddress, num);
}
/*
函数功能：发送一个十六进制数组
输入：串口基地址、要发送数组、数组的长度
    填入值包括：
    EUSCI_A0_BASE    
    EUSCI_A1_BASE    
    EUSCI_A2_BASE    
    EUSCI_A3_BASE 
    
输出：无
备注：无
*/
void        UART_Send_Hexarry(uint32_t  baseAddress,uint8_t    *arry,uint8_t lenth)
{
    
    unsigned int k=0;
  do 
  {
      UART_transmitData( baseAddress, *(arry + k) );
      k++;
  } while(lenth>k);
}
                
/*
函数功能：发送一个字符串进制数据
输入：串口基地址、要发送的字符串数据
    填入值包括：
    EUSCI_A0_BASE    
    EUSCI_A1_BASE    
    EUSCI_A2_BASE    
    EUSCI_A3_BASE 
    
输出：无
备注：无
*/
void    UART_Send_string(uint32_t baseAddress,char *str)
{
    unsigned int k=0;
  do 
  {
      UART_transmitData( baseAddress, *(str + k) );
      k++;
  } while(*(str + k)!='\0');
}
/*
函数功能：//usartA0初始化
输入：无
输出：无
备注：波特率115200,8位数据位，1位停止位，无奇偶校验
TX1.3   RX1.2
*/
void UARTA0_Init(void)	
{
		//gpio初始化，1.2 RX, 1.3 TX
        GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN3,GPIO_PRIMARY_MODULE_FUNCTION);
        GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1, GPIO_PIN2,GPIO_PRIMARY_MODULE_FUNCTION);

	//结构体初始化
        eUSCI_UART_ConfigV1 huart;
        huart.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;		//时钟SMCLK
        huart.clockPrescalar = 26;										//波特率115200
        huart.secondModReg=111;
        huart.firstModReg=0;
        huart.overSampling = EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;	//过采样波特
        huart.parity = EUSCI_A_UART_NO_PARITY;								
        huart.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;					//左对齐
        huart.numberofStopBits = EUSCI_A_UART_ONE_STOP_BIT;				//一位停止位
        huart.uartMode = EUSCI_A_UART_MODE;								//usart模式
        huart.dataLength=EUSCI_A_UART_8_BIT_LEN;							//8位数据长
	
        UART_initModule(EUSCI_A0_BASE,&huart);							//usartA0初始化
        //启用 UART 模块进行操作
        UART_enableModule(EUSCI_A0_BASE);
        UART_clearInterruptFlag(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);	  //清除中断标志
        UART_enableInterrupt(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);	 //启用接收中断
        Interrupt_enableInterrupt(INT_EUSCIA0);									//使能串口中断

}


/*
函数功能：//usartA1初始化
输入：无
输出：无
备注：
        波特率115200,8位数据位，1位停止位，无奇偶校验
        TX2.3   RX2.2
*/
void UARTA1_Init(void)	
{
		//gpio初始化，2.2 RX, 2.3 TX
        GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN3,GPIO_PRIMARY_MODULE_FUNCTION);
        GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P2, GPIO_PIN2,GPIO_PRIMARY_MODULE_FUNCTION);

	//结构体初始化
        eUSCI_UART_ConfigV1 huart1;
        huart1.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;		//时钟SMCLK
        huart1.clockPrescalar = 26;										//波特率115200
        huart1.secondModReg=111;
        huart1.firstModReg=0;
        huart1.overSampling = EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;	//过采样波特
        huart1.parity = EUSCI_A_UART_NO_PARITY;								
        huart1.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;					//左对齐
        huart1.numberofStopBits = EUSCI_A_UART_ONE_STOP_BIT;				//一位停止位
        huart1.uartMode = EUSCI_A_UART_MODE;								//usart模式
        huart1.dataLength=EUSCI_A_UART_8_BIT_LEN;							//8位数据长

        UART_initModule(EUSCI_A1_BASE,&huart1);							//usartA1初始化
    //启用 UART 模块进行操作
        UART_enableModule(EUSCI_A1_BASE);
    
        
        UART_clearInterruptFlag(EUSCI_A1_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);	  //清除中断标志
        UART_enableInterrupt(EUSCI_A1_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);	 //启用接收中断
        Interrupt_enableInterrupt(INT_EUSCIA1);									//使能串口中断

}



/*
函数功能：//usartA2初始化
输入：无
输出：无
备注：     
           波特率115200,8位数据位，1位停止位，无奇偶校验
           TX3.3   RX3.2
*/
void UARTA2_Init(void)	
{
		//gpio初始化，3.2 RX, 3.3 TX
        GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P3, GPIO_PIN3,GPIO_PRIMARY_MODULE_FUNCTION);
        GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P3, GPIO_PIN2,GPIO_PRIMARY_MODULE_FUNCTION);

	//结构体初始化
        eUSCI_UART_ConfigV1 huart2;
        huart2.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;		//时钟SMCLK
        huart2.clockPrescalar = 26;										//波特率115200
        huart2.secondModReg=111;
        huart2.firstModReg=0;
        huart2.overSampling = EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;	//过采样波特
        huart2.parity = EUSCI_A_UART_NO_PARITY;								
        huart2.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;					//左对齐
        huart2.numberofStopBits = EUSCI_A_UART_ONE_STOP_BIT;				//一位停止位
        huart2.uartMode = EUSCI_A_UART_MODE;								//usart模式
        huart2.dataLength=EUSCI_A_UART_8_BIT_LEN;							//8位数据长

        UART_initModule(EUSCI_A2_BASE,&huart2);							//usartA1初始化
    //启用 UART 模块进行操作
        UART_enableModule(EUSCI_A2_BASE);
    
        
        UART_clearInterruptFlag(EUSCI_A2_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);	  //清除中断标志
        UART_enableInterrupt(EUSCI_A2_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);	 //启用接收中断
        Interrupt_enableInterrupt(INT_EUSCIA2);									//使能串口中断

}


void EUSCIA0_IRQHandler(void)
{
    uint8_t receivedData = 0;
    if(UART_getEnabledInterruptStatus(EUSCI_A0_BASE)==EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG)
    {
         receivedData = UART_receiveData(EUSCI_A0_BASE);
        protocol_data_recv(&receivedData, 1);
    }
}

//******************************************************************************
//
//USCI_A0中断服务函数。
//
//******************************************************************************
//void EUSCIA0_IRQHandler(void)
//{
//	static uint8_t Serial_s=0;
//    static uint8_t Serial_p=0;
//    uint8_t receivedData = 0;

//    if(UART_getEnabledInterruptStatus(EUSCI_A0_BASE)==EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG)
//    {
//            receivedData = UART_receiveData(EUSCI_A0_BASE);
//            UART_transmitData(EUSCI_A0_BASE,receivedData);
//			 if(Serial_s==0)
//                    {
//                        if( receivedData ==0xFF)
//                        {
//                            Serial_s=1;
//                            Serial_p=0;
//                            Serial_Rx[Serial_p]=receivedData;
//                        }
//                    }
//                    else if(Serial_s==1)
//                    {
//                        if( receivedData ==0xFF)
//                        {
//                            Serial_s=2;
//                            Serial_p=1;
//                            Serial_Rx[Serial_p]=receivedData;
//                        }
//                    }
//                    else if(Serial_s==2)
//                    {
//                        Serial_p++;
//                        Serial_Rx[Serial_p]=receivedData;
//                        if(Serial_p>=9)
//                        {
//        //                    Serial_p=0;
//                            Serial_s=3;
//                        }
//                    }
//                    else if(Serial_s==3)
//                    {
//                        if( receivedData ==0xFE)
//                        {
//                            Serial_s=0;
//                            Serial_Rx[Serial_p]=receivedData;
//                        }
//                    }
//    }
//}
//******************************************************************************
//
//USCI_A1中断服务函数。
//
//******************************************************************************
void EUSCIA1_IRQHandler(void)
{
	static uint8_t Serial_s=0;
    static uint8_t Serial_p=0;
    uint8_t receivedData = 0;

    if(UART_getEnabledInterruptStatus(EUSCI_A1_BASE)==EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG)
    {
            receivedData = UART_receiveData(EUSCI_A1_BASE);
            UART_transmitData(EUSCI_A1_BASE,receivedData);
			 if(Serial_s==0)
                    {
                        if( receivedData ==0x2C)
                        {
                            Serial_s=1;
                            Serial_p=0;
                            Serial_Rx[Serial_p]=receivedData;
                        }
                    }
                    else if(Serial_s==1)
                    {
                        if( receivedData ==0x12)
                        {
                            Serial_s=2;
                            Serial_p=1;
                            Serial_Rx[Serial_p]=receivedData;
                        }
                    }
                    else if(Serial_s==2)
                    {
                        Serial_p++;
                        Serial_Rx[Serial_p]=receivedData;
                        if(Serial_p>=17)
                        {
        //                    Serial_p=0;
                            Serial_s=3;
                        }
                    }
                    else if(Serial_s==3)
                    {
                        if( receivedData ==0x5B)
                        {
                            Serial_s=0;
                            Serial_Rx[Serial_p]=receivedData;
                        }
                    }
    }
}
//******************************************************************************
//
//USCI_A1中断服务函数。
//
//******************************************************************************

//void EUSCIA1_IRQHandler(void)
//{

//    uint8_t receivedData = 0;

//       if(UART_getEnabledInterruptStatus(EUSCI_A1_BASE)==EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG)
//       {
//               receivedData = UART_receiveData(EUSCI_A1_BASE);
//               UART_transmitData(EUSCI_A1_BASE,receivedData);

//       }
//}


//******************************************************************************
//
//USCI_A2中断服务函数。
//
//******************************************************************************

void EUSCIA2_IRQHandler(void)
{

    uint8_t receivedData = 0;

       if(UART_getEnabledInterruptStatus(EUSCI_A2_BASE)==EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG)
       {
               receivedData = UART_receiveData(EUSCI_A2_BASE);
               UART_transmitData(EUSCI_A2_BASE,receivedData);

       }
}
